package com.liuyi.netty.im.lychat.modular.service;

import cn.hutool.core.util.EnumUtil;
import com.liuyi.netty.im.commons.codes.data.event.Session;
import com.liuyi.netty.im.lychat.modular.caches.ChatSessionCache;
import com.liuyi.netty.im.lychat.modular.entity.ChatSession;
import com.liuyi.netty.im.lychat.modular.enums.SessionType;
import com.liuyi.netty.im.lychat.modular.mapper.ChatSessionMapper;
import com.liuyi.netty.im.server.util.ImHelp;
import com.liuyi.rapid.develop.mybatis.plus.base.IBaseService;

import java.util.List;

/**
 * <p>
 * 聊天会话表 服务类
 * </p>
 *
 * @author mybatis-plus
 * @since 2021-12-29
 */
public interface IChatSessionService extends IBaseService<ChatSession> {

    @Override
    default Class<ChatSession> getEntityClass() {
        return ChatSession.class;
    }

    @Override
    @SuppressWarnings("unchecked")
    default ChatSessionMapper getMapper() {
        return (ChatSessionMapper) getBaseMapper();
    }

    ChatSessionCache cache();

    /**
     * 通过用户id查询会话列表（按更新时间排序）
     *
     * @param userId 用户id
     * @return {@link List}<{@link ChatSession}>
     */
    default List<ChatSession> listByUserId(String userId) {
        return list(q().eq(ChatSession.USER_ID, userId));
    }

    default void removeSession(String userId, String sessionId) {
        this.remove(q().eq(ChatSession.USER_ID, userId).eq(ChatSession.SESSION_ID, sessionId));
        cache().removeUserIdAndSessionId(userId, sessionId);
        cache().removeLastMessage(userId, sessionId);
    }

    /**
     * 创建会话
     *
     * @param userId    用户id
     * @param sessionId 会话id
     * @return {@link ChatSession}
     */
    default ChatSession createSession(String userId, String sessionId) {
        return createSession(userId, ImHelp.sessionIdToId(sessionId), EnumUtil.fromString(SessionType.class, ImHelp.sessionIdToType(sessionId).name()));
    }

    /**
     * 创建会话
     *
     * @param userId      用户id
     * @param toId        对方id
     * @param sessionType 会话类型
     * @return {@link ChatSession}
     */
    ChatSession createSession(String userId, String toId, SessionType sessionType);

    /**
     * 包装会话
     *
     * @param chatSessions 聊天会话
     * @return {@link List}<{@link Session}>
     */
    List<Session> wrapperSession(List<ChatSession> chatSessions);

    /**
     * 包装会话
     *
     * @param chatSession 聊天会话
     * @return {@link List}<{@link Session}>
     */
    Session wrapperSession(ChatSession chatSession);
}
